package lector.rome;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
import io.Feed;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import lector.Lector;
import lector.RSSException;

/**
 * Clase que implementa los métodos para trabajar con objetos de la clase
 * io.Feed. Implementa la interface Lector.
 *
 * @author Nicolás Garay
 * @author Alejandro Jacquet
 * @author Rita Romani
 */
public class RomeLector implements Lector {

    /**
     * Constructor de la clase.
     */
    public RomeLector() {
    }

    /**
     * Método que devuelve una lista con objetos de io.Feed.
     *
     * @param url String dirección de la suscripción donde realizar la lectura
     * de feeds
     * @return List<Feed>
     * @throws RSSException excepción lanzada por el Lector RSS (Mensaje: Se
     * produjo un error al leer los feeds correspondientes a la url )
     */
    @Override
    public List<Feed> leerFeeds(String url) throws RSSException {
        try {
            /*
             * Definimos el objeto ArrayList que se retornará como salida del
             * método, con los objetos Feed correspondientes a la url ingresada
             * como parámetro.
             */
            ArrayList<Feed> list = new ArrayList<Feed>();
            /*
             * Crea un objeto de la clase URL, el cual se usa luego en la
             * lectura del feed
             */
            URL feedUrl = new URL(url);
            /*
             * - SyndFeedInput es una clase que elije el correcto analizador
             * para el feed, dependiendo de su tipo y versión.
             */
            SyndFeedInput input = new SyndFeedInput();
            /*
             * - SyndFeed es una interface para representar feeds de distintos
             * tipos (RSS, ATOM). - XmlReader es un lector para la URL
             * correspondiente al feed, ya que el mismo se encuentra en formato
             * XML. - SyndFeedInput.build() es un método que devuelve una
             * instancia de SyndFeed (luego de usar el correcto analizador),
             * para que se pueda trabajar facilmente con el feed obtenido.
             */
            SyndFeed feed = input.build(new XmlReader(feedUrl));
            /*
             * Creamos un objeto ArrayList, que contendrá objetos SyndEntry
             */
            List<SyndEntry> entries = new ArrayList<SyndEntry>();
            /*
             * Obtenemos la lista de objetos SyndEntry correspondientes al feed
             * que terminamos de leer. Cada uno de estos objetos contienen
             * información sobre cada actualización del feed.
             */
            entries = feed.getEntries();
            /*
             * Iterador que nos permite recorrer el ArrayList entries
             */
            Iterator<SyndEntry> iterator = entries.iterator();
            while (iterator.hasNext()) {
                SyndEntry entry = iterator.next();
                /*
                 * Creamos el objeto Feed con los valores de los atributos que
                 * obtenemos en cada entry al recorrer el ArrayList. Luego
                 * agregamos el objeto creado a list.
                 */
                list.add(new Feed(entry.getTitle(), entry.getDescription().getValue(), entry.getDescription().getType(), entry.getAuthor(), entry.getLink(), entry.getPublishedDate(), false));
            }
            return list;
        } catch (Exception ex) {
            throw new RSSException("Se produjo un error al leer los feeds correspondientes a la url: " + url, ex);
        }
    }
}
